﻿
#ifndef GY_CONTROLTREEVIEW_H
#define GY_CONTROLTREEVIEW_H

#include <QObject>
#include <QComboBox>
#include "GY_IdTreeView.h"
#include "CustomFilterModule.h"
#include "ReflectionAPI/GY_ReflectionClass.h"

class GY_CONTROLLIBRARY_EXPORT GY_ControlTreeView : public GY_IdTreeView
{
    Q_OBJECT
public:
    explicit GY_ControlTreeView(QWidget *parent = nullptr);
    ~GY_ControlTreeView();

    //-----------------------------列编辑接口---------------------------//
    /**
     * @brief registerControl 注册自定义控件
     * @param columnIndex 注册自定义控件的列号
     * @return 成功/失败
     */
    template<typename T>
    bool registerControl(qint32 columnIndex);
    /**
     * @brief addColumnAndRegisterControl 添加空白列并为该列注册控件
     * @param columnName 列名
     */
    template<typename T>
    void addColumnAndRegisterControl(const QString &columnName);
    /**
     * @brief insertColumnAndRegisterControl 插入空白列并为该列注册控件
     * @param index 注册控件的列名称
     * @param columnName
     */
    template<typename T>
    void insertColumnAndRegisterControl(int index, const QString &columnName);
    //-----------------------------行编辑接口---------------------------//
    /**
     * @brief addRowData  添加行数据
     * @param rowId 行Id
     * @param rowData 行数据
     * @param nodeParentId 父级Id
     * @param nodeType 节点类型
     * @return 返回添加是否成功
     */
    virtual bool addRowData(const QVariant &rowId, const QVector<QVariant>&rowData, const QVariant &nodeParentId=QVariant(), const QVariant &nodeType=QVariant());
    /**
     * @brief insertRowData   插入行数据
     * @param rowId 节点id
     * @param rowData 插入的行数据
     * @param index 引索第几个
     * @param nodeParentId 父级Id
     * @param nodeType 节点类型
     * @return 返回插入行数据是否成功
     */
    virtual bool insertRowData(const QVariant &rowId, const QVector<QVariant>&rowData,const int index, const QVariant &nodeParentId=QVariant(), const QVariant nodeType=QVariant());

public slots:
    /**
     * @brief slt_ControlDataUpdate 控件数据更新
     * @param rowId 行Id
     * @param columnIndex 列索引
     * @param data 更新后的数据
     */
    void slt_ControlDataUpdate(const QVariant &rowId, qint32 columnIndex, const QVariant &data);

signals:

private:
    //!注册控件信息
    QMap<qint32,QString> m_RegisterInfo;
    //!表格model
    QStandardItemModel* m_pViewModel;
    //! 注册工厂
    GY_ReflectionClass m_Reflection;
    //!列数
    int m_ColumnNumber = 0;
};

/**
 * @brief GY_ControlTreeView::registerControl 注册自定义控件
 * @param columnIndex 列索引
 * @return 注册结果
 */
template<typename T>
bool GY_ControlTreeView::registerControl(qint32 columnIndex)
{
    m_Reflection.registerClass<T>();
    m_RegisterInfo.insert(columnIndex,T::staticMetaObject.className());
}

/**
 * @brief GY_ControlTreeView::addColumnAndRegisterControl 新增一列并注册自定义控件
 * @param columnName 列索引
 */
template<typename T>
void GY_ControlTreeView::addColumnAndRegisterControl(const QString &columnName)
{
    addColumn(columnName);
    registerControl<T>(m_pModel->columnCount()-1);
}

/**
 * @brief GY_ControlTreeView::insertColumnAndRegisterControl 插入一列并注册自定义控件
 * @param columnIndex 列索引
 * @param columnName 列名称
 */
template<typename T>
void GY_ControlTreeView::insertColumnAndRegisterControl(int columnIndex, const QString &columnName)
{
    //超出范围则返回
    if(columnIndex<0 || columnIndex>m_pModel->columnCount()){
        return;
    }
    insertColumn(columnIndex,columnName);
    registerControl<T>(columnIndex);
    QMap<qint32,QString> tempMap;
    while(columnIndex<=m_RegisterInfo.lastKey()){
        tempMap.insert(m_RegisterInfo.lastKey()+1,m_RegisterInfo[m_RegisterInfo.lastKey()]);
        m_RegisterInfo.remove(m_RegisterInfo.lastKey());
    }
    while(!tempMap.isEmpty()){
        m_RegisterInfo.insert(tempMap.firstKey(),tempMap[tempMap.firstKey()]);
        tempMap.remove(tempMap.firstKey());
    }
}

#endif // GY_CONTROLTREEVIEW_H
